package com.netty8018.nettydemo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.concurrent.EventExecutorGroup;

import java.nio.charset.StandardCharsets;

/**
 * @author liyanhao
 * @Date 2023-02-04 18:00
 * 1.我们自定义一个Handler 需要继续Netty规划好的HandlerAdapter规范
 * 2.这时我们自定义一个handler,才能称为一个Handler
 */
public class NettyServerHeandler extends ChannelInboundHandlerAdapter {
    //读取数据实际 这里我们可以读取客户端发送的消息

    /**
     * 1.ChannelHandlerContext 上下文对象 含有管道pipeline,通道channel 地址
     * 2.Object msg 这就是客户端发送的数据 默认Object
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服务器读取线程 " + Thread.currentThread().getName());
        System.out.println("server ctx=" + ctx);
        System.out.println("看看 channel 和pipline的关系");
        Channel channel = ctx.channel();
        ChannelPipeline pipeline = ctx.pipeline();//本质是一个双向链表，出栈入栈

        //将msg转成一个ByteBuf
        //ByteBuf 是Netty提供的 不是NIO的ByteBuffer
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("客户端发送消息是:" + byteBuf.toString(StandardCharsets.UTF_8));
        System.out.println("客户端地址:" + channel.remoteAddress());
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //writeAndFlush 是 write+flush
        //数据写入到缓存 并刷新
        //一般来讲 我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~", StandardCharsets.UTF_8));
    }
    //处理异常 一般是需要关闭通道的

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}










